package com.janko.springbootbase.controller.unitvolatile;

import java.util.concurrent.TimeUnit;

/**
 * @ClassName VolatileUnit
 * @Description TODO:
 * @Author janko
 * @Date 2020/12/4 11:44
 */
public class VolatileUnit {
    /**
     * volatile 特性：
     * 1、线程之间的可见性
     * 2、防止指令重排(要用C++的程序去看)
     *   2.1: 指令乱序的执行：CPU在进行读等待的同时执行命令，是CPU乱序的根源 (不是乱，而是为了提高效率)
     */

    //用来判断当前线程是否运行
    volatile boolean running = true;

    //测试 volatile的线程可见性
    void m() {
        //方法中 如果running一直是true  则会死线程
        System.out.println("m start ");
        while (running) {
            /**
             * System.out.println 会刷新主内存.
             * why?  println的源码中，是添加了Synchronized的
             */
//            System.out.println("一些业务");
        }
        System.out.println("m end ");
    }

    //volatiled的线程之间可见性
    public static void main(String[] args)  {
        VolatileUnit vu = new VolatileUnit();
        //开启一个线程
        new Thread(vu::m, "t1").start();
        try {
            TimeUnit.SECONDS.sleep(1);
            System.out.println("1秒后");
        } catch (Exception e) {
            e.printStackTrace();
        }
        vu.running = false;
    }
}
